<!--
 * @Author: your name
 * @Date: 2021-04-06 15:50:44
 * @LastEditTime: 2021-04-06 17:54:20
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: /Interview Files/大纲/1113函数柯里化.html
-->
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>函数柯里化</title>
</head>

<body>

</body>

</html>
<script>
    // 实现一个add方法，使计算结果能够满足如下预期：
    // add(1)(2)(3) = 6;
    // add(1, 2, 3)(4) = 10;
    // add(1)(2)(3)(4)(5) = 15;

    function add() {
        // 第一次执行时，定义一个数组专门用来存储所有的参数
        var _args = Array.prototype.slice.call(arguments);

        // 在内部声明一个函数，利用闭包的特性保存_args并收集所有的参数值
        var _adder = function() {
            _args.push(...arguments);
            return _adder;
        };

        // 利用toString隐式转换的特性，当最后执行时隐式转换，并计算最终的值返回
        _adder.toString = function() {
            return _args.reduce(function(a, b) {
                return a + b;
            });
        }
        return _adder;
    }

    console.log(add(1)(2)(3)); // 6
    console.log(add(1, 2, 3)(4)); // 10
    console.log(add(1)(2)(3)(4)(5)); // 15
    console.log(add(2, 6)(1)); // 9
</script>